// 判断是否为对象
function isObject(obj){
    if (typeof obj === 'object'&&obj !==null&&obj.constructor === Object) {
        return true
    } else {
        return false
    }
}

/**
 * {object} options 参数对象
 * options对象
 *  {string} url 请求地址
 *  {string} type 请求方式
 *  {string|object} data 请求参数
 *  {Boolean} cache 是否使用缓存
 *  {string} dataType 返回的数据类型
 *  {function} success 成功的回调函数
 *  {function} error 失败的回调函数
*/
//阿贾克斯请求示例
 // ajax({
 //        url: './data/4-test.php',
 //        type: 'get',
 //        data: {
 //            user: 'xiaocuo',
 //            pass: '123456'
 //        },
 //        cache: true,
 //        dataType: 'json',
 //        success: function (json){
 //            show.innerHTML = json.msg
 //        },
 //        error: function (){
 //            alert('网络异常，请稍后重试')
 //        }
 //    })
function ajax(options){
    // 1. 创建数据交互对象XMLHttpRequest对象（ajax对象）
    var xhr = new XMLHttpRequest()//除了IE56都支持
    // var xhr = new ActiveXObject('Microsoft.XMLHTTP')//ie56支持

    // 判断data参数数据类型 string or object
    
    var data = ''//保存格式化之后的参数 options.data
    if (typeof options.data === 'string') {
        // 如果是字符串不做任何处理，直接赋值
        data = options.data
    }
    if (isObject(options.data)) {
        // 如果options.data是对象，则格式化为字符串 'user=xiapcuo&pass=123456'
        for (var key in options.data){
            data += (key+'='+options.data[key]+'&')
        }
        // data = 'user=xiapcuo&pass=123456&'
        // 去掉最后一个&
        // data = data.substr(0,data.length-1)
        data = data.substring(0,data.length-1)
    }

    // 判断请求方式
    if (options.type.toLowerCase() === 'get') {
        // 是否使用缓存
        if (options.cache) {
            // 2. 初始化请求
            xhr.open(options.type,options.url+'?'+data,true)
        } else {
            // 2. 初始化请求
            xhr.open(options.type,options.url+'?'+data+'&_='+Date.now(),true)
        }
        // 3. 发送请求
        xhr.send(null)//get请求
    } else if (options.type.toLowerCase() === 'post'){
        // 2. 初始化请求
        xhr.open(options.type,options.url,true)
        // 设置请求头，作用是 模拟表单的post方式提交数据
        xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded')
        // 3. 发送请求
        // post请求在此传参
        xhr.send(data)
    } else {
        alert('目前仅支持get或post请求！')
        return
    }

    // 4. 监听 请求状态 响应状态
    // xhr.readyState 代表请求状态 0-4
    // 当 xhr.readyState 请求状态发生改变时，会触发一个事件 readyStateChange
    xhr.onreadystatechange = function (){
        // console.log( xhr.readyState )// 2 3 4
        if (xhr.readyState === 4){//请求完成
            // 这时还不能拿到数据
            // console.log( xhr.status )//http响应状态码
            if (xhr.status >= 200 && xhr.status < 300) {
                if (options.dataType === 'json') {
                    // 如果是 json 数据，解析成对象之后再传出
                    var json = JSON.parse(xhr.responseText)
                    options.success(json)
                } else if (options.dataType === 'xml'){
                    options.success(xhr.responseXML)
                } else {
                    options.success(xhr.responseText)
                }
            } else {
                options.error(xhr.status)
            }
        }
    }
}
//jsonp请求数据的方式示例
// jsonp({//options对象
//         url: 'http://suggestion.baidu.com/su',
//         // data: 'wd=123',
//         data: {
//             wd: search.value
//         },
//         jsonp: 'cb',//回调函数的参数名,值按接口文档写
//         jsonpCallback: 'hehe',//回调函数名，自定义
//         success: function (json){
//            console.log(json)
//         }
//     })
function jsonp(options){
    // 将window对象的一个属性success指向options.success函数
    window[options.jsonpCallback] = options.success

    var data = ''
    // 判断数据类型，并格式化为字符串
    if (Object.prototype.toString.call(options.data) === '[object Object]'){
        for (var key in options.data){
            data += (key+'='+options.data[key]+'&')
        }
        data = data.substr(0,data.length-1)
    }
    if (Object.prototype.toString.call(options.data) === '[object String]') {
        data = options.data
    }

    var oScript = document.createElement('script')
    oScript.src = options.url+'?'+data+'&'+options.jsonp+'='+options.jsonpCallback
    // oScript.src = 'http://suggestion.baidu.com/su?wd='+search.value+'cb=success'
    document.body.appendChild(oScript)
    oScript.onload = function (){
        // 当数据加载完成后，删除当前script标签
        document.body.removeChild(oScript)
    }
}
// 使用promse方法的Ajax请求API模式示例
 // promiseAjax({
 //        url: './data.php',
 //        type: 'get',
 //        data: 'code=abc123',
 //        dataType: 'json'
 //    })
function promiseAjax(options){
    return new Promise(function (resolve,reject){
        // 1. 创建数据交互对象XMLHttpRequest对象（ajax对象）
        var xhr = new XMLHttpRequest()//除了IE56都支持
        // var xhr = new ActiveXObject('Microsoft.XMLHTTP')//ie56支持

        // 判断data参数数据类型 string or object
        
        var data = ''//保存格式化之后的参数 options.data
        if (typeof options.data === 'string') {
            // 如果是字符串不做任何处理，直接赋值
            data = options.data
        }
        if (isObject(options.data)) {
            // 如果options.data是对象，则格式化为字符串 'user=xiapcuo&pass=123456'
            for (var key in options.data){
                data += (key+'='+options.data[key]+'&')
            }
            // data = 'user=xiapcuo&pass=123456&'
            // 去掉最后一个&
            // data = data.substr(0,data.length-1)
            data = data.substring(0,data.length-1)
        }

        // 判断请求方式
        if (options.type.toLowerCase() === 'get') {
            // 是否使用缓存
            if (options.cache) {
                // 2. 初始化请求
                xhr.open(options.type,options.url+'?'+data,true)
            } else {
                // 2. 初始化请求
                xhr.open(options.type,options.url+'?'+data+'&_='+Date.now(),true)
            }
            // 3. 发送请求
            xhr.send(null)//get请求
        } else if (options.type.toLowerCase() === 'post'){
            // 2. 初始化请求
            xhr.open(options.type,options.url,true)
            // 设置请求头，作用是 模拟表单的post方式提交数据
            xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded')
            // 3. 发送请求
            // post请求在此传参
            xhr.send(data)
        } else {
            alert('目前仅支持get或post请求！')
            return
        }

        // 4. 监听 请求状态 响应状态
        // xhr.readyState 代表请求状态 0-4
        // 当 xhr.readyState 请求状态发生改变时，会触发一个事件 readyStateChange
        xhr.onreadystatechange = function (){
            // console.log( xhr.readyState )// 2 3 4
            if (xhr.readyState === 4){//请求完成
                // 这时还不能拿到数据
                // console.log( xhr.status )//http响应状态码
                if (xhr.status >= 200 && xhr.status < 300) {
                    if (options.dataType === 'json') {
                        // 如果是 json 数据，解析成对象之后再传出
                        var json = JSON.parse(xhr.responseText)
                        resolve(json)
                    } else if (options.dataType === 'xml'){
                        resolve(xhr.responseXML)
                    } else {
                        resolve(xhr.responseText)
                    }
                } else {
                    reject(xhr.status)
                }
            }
        }
    })
}

// 设置cookie示例
// setCookie({
//     key: 'user1',
//     val: '111asdasd',
//     days: 7,
//      domain: '127.0.0.1',
//      path: '/tao'
// })
function setCookie(options){
    if (!options.key||!options.val) {
        // return
        throw new Error('key和val是必传参数')
    }
    var days = options.days || 0
    var path = options.path || ''
    var domain = options.domain || ''
    // escape(options.val) 对存储的数据进行编码处理
    if (days === 0) {//不设置有效期
        document.cookie = options.key+'='+escape(options.val)+'; path='+path+'; domain='+domain
    } else {
        var d = new Date()
        d.setDate(d.getDate()+days)
        document.cookie = options.key+'='+escape(options.val)+'; path='+path+'; domain='+domain+'; expires='+d
    }
}

// 获取cookie
function getCookie(key){
    var arr1 = document.cookie.split('; ')
    //["user1=111asdasd", "user2=222gfhft", "user3=333wwwaa"]
    for(var i = 0; i < arr1.length; i++){
        var arr2 = arr1[i].split('=')//['user1','111asdasd']
        if (arr2[0] === key) {
            // 对数据进行解码并返回
            return unescape(arr2[1])
        }
    }
    return null
}

// 删除cookie
function removeCookie(key){
    setCookie({
        key: key,
        val: '123',
        days: -2
    })
}


